package top.kaoshanji.p1ch04a;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;

/**
 * 代码清单-p1ch04a-111页a：通过@Pointcut注解声明频繁使用的切点表达式
 * @author kaoshanji
 * ^_^
 * create time 2025/4/23 15:37
 */
@Aspect // 声明为一个切面
public class Audience {

    // 定义命名的切点
    @Pointcut("execution(* top.kaoshanji.p1ch04a.Performance.perform(..))")
    public void performance() {}

    /**
     * 代码清单-p1ch04a-114页a：使用环绕通知重新实现Audience切面
     * @param jp
     */
    @Around("performance()") // 环绕通知方法
    public void watchPerformance(ProceedingJoinPoint jp) {
        try {
            System.out.println("Silencing cell phones");
            System.out.println("Taking seats");

            // 不要忘记调用这个方法
            jp.proceed();

            System.out.println("CLAP CLAP CLAP!!!");
        } catch (Throwable e) {
            System.out.println("Demanding a refund");
        }
    }

/*
    // 前置....后置通知
    // 表演之前
    @Before("performance()")
    public void silenceCellPhone () {
        System.out.println("Silencing cell phones");
    }

    // 表演之前
    @Before("performance()")
    public void takeSeats () {
        System.out.println("Taking seats");
    }

    // 表演之后
    @AfterReturning("performance()")
    public void applause () {
        System.out.println("CLAP CLAP CLAP!!!");
    }

    // 表演失败之后
    @AfterThrowing("performance()")
    public void demandRefund () {
        System.out.println("Demanding a refund");
    }

    */
}
